#pragma GCC optimize(2)
#include <iostream>
#include <math.h>
#include <map>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
/*
    序列排序问题
    分两次排序
    1. 第一次按照数字各个位数之和排序。
    2. 第二次找到第一次相等的开始和结束索引，然后再安排原本数的大小排序
    3. 在第二次排序寻找索引的时候，可先判断下剩下的是全部相等还是局部相等（遍历寻找相等索引）
*/
static bool cmp(const pair<int, int> &a, const pair<int, int> &b)
{
    // 以pair对的第2个数的大小从大往小排序
    return a.second > b.second;
}

bool cmp1(pair<int, int> a, pair<int, int> b)
{
    return a.first > b.first;
}
void test()
{
    int n, temp, total, num;
    vector<pair<int, int>> nums;
    cin >> n;
    vector<int> res;
    vector<int> factor;
    while (cin >> temp, getchar() != '\n') // 17 26 9 13 88 10，全部写入缓冲区。cin >> temp 读取第一个17，然后遇到空格，放弃读取，getchar()把空格读取了进行判断，然后进入循环，以此类推，直到读到换行
    {
        factor.push_back(temp);
    }
    // 第一次排序
    for (size_t i = 0; i < n; i++)
    {
        total = 0;
        temp = factor[i];
        num = temp;
        while (temp != 0)
        {
            total += temp % 10;
            temp /= 10;
        }
        nums.push_back(pair<int, int>(num, total));
    }
    sort(nums.begin(), nums.end(), cmp); // 完成第一次排序

    for (size_t i = 0; i < (nums.size() - 1); i++)
    {
        if (nums[i].second != nums[i + 1].second)
        {
            continue;
        }
        else // 找到total数字和相等的，就按照原本数字大小排序
        {
            if (nums[i].second == (nums.end() - 1)->second) // 如果后面全部相等
            {
                sort(nums.begin() + i, nums.end(), cmp1);
            }

            for (size_t j = i; j < nums.size(); j++)
            {
                if (nums[j].second != nums[i].second)
                {
                    sort(nums.begin() + i, nums.begin() + j, cmp1);
                    break;
                }
            }
        }
    }
    for (size_t i = 0; i < nums.size(); i++)
    {
        cout << nums[i].first << endl;
    }
}

int main()
{
    test();
    return 0;
}